package nayasis.common.util;

import java.text.ParseException;
import java.util.regex.Pattern;

import nayasis.common.log.NLogger;

/**
 * 값의 정합성을 확인하는 클래스
 * 
 * @author nayasis
 */
public abstract class Validator {

    /**
     * 날짜가 정상인지를 확인한다
     *
     * @param value 날짜 (YYYY-MM-DD 형식)
     * @return 날짜 정상여부
     */
    public static boolean isDate( String value ) {

        return isDate( value, "YYYY-MM-DD" );

    }

    /**
     * 날짜가 정상인지를 확인한다.
     *
     * @param value 날짜
     * @param format 날짜를 구성하는 포맷 ((예) YYYY-MM-DD HH:MI:SS)
     * @return 날짜 정상여부
     */
    public static boolean isDate( String value, String format ) {

        try {

            NDate date = new NDate( value, format );

            return value.equalsIgnoreCase( date.toString(format) );

        } catch ( ParseException e ) {
            NLogger.sys.println( e );
            return false;
        }

    }

    /**
     * 문자열이 NULL인지 여부를 확인한다.
     * 
     * @param value 검사할 문자열
     * @return 검사결과
     */
    public static boolean isNull( String value ) {
        return value == null;
    }

    /**
     * 문자열에 값이 없는지 여부를 확인한다.
     * 
     * @param value 검사할 문자열
     * @return 검사결과
     */
    public static boolean isEmpty( String value ) {
        return value == null || value.length() == 0;
    }
    
    /**
     * 정규식을 이용해 문자열을 검사한다.
     * 
     * @param value   검사할 문자열
     * @param pattern 정규식
     * @return 정규식 일치여부
     */
    public static boolean isMatched( String value, String pattern ) {

        return Pattern.matches( pattern, value );
        
    }
    
    /**
     * 문자열이 숫자로만 구성되어 있는지 여부를 확인한다.
     * 
     * @param value 검사할 문자열
     * @return 검사결과
     */
    public static boolean isNumber( String value ) {
        return isMatched( value, "^[-0-9]+$" );
    }

    /**
     * 수치자료인지 여부를 확인한다. (소수점을 포함하는 경우에도 체크 가능)
     * 
     * @param value 검사할 문자열
     * @return 검사결과
     */
    public static boolean isNumeric( String value ) {
        
        try {
            Double.parseDouble( value );
        } catch( Exception e ) {
            return false;
        }
        
        return true;
        
    }

    /**
     * 문자열이 숫자를 가지고 있는지 여부를 확인한다.
     * 
     * @param value 검사할 문자열
     * @return 검사결과
     */
    public static boolean hasNumber( String value ) {
        return ! isMatched( value, "^[^0-9]+$" );
    }

    /**
     * 문자열에 한글을 가지고 있는지 여부를 확인한다.
     * 
     * @param value 검사할 문자열
     * @return 검사결과
     */
    public static boolean hasKorean( String value ) {
        return ! isMatched( value, "^[^ㄱ-ㅎㅏ-ㅣ가-힣]+$" );
    }

    /**
     * 문자열이 한글로만 구성되어있는지 여부를 확인한다.
     * 
     * @param value 검사할 문자열
     * @return 검사결과
     */
    public static boolean isKorean( String value ) {
        return isMatched( value, "^[ㄱ-ㅎㅏ-ㅣ가-힣]+$" );
    }
    
    /**
     * 문자열이 영문자로만 구성되어있는지 여부를 확인한다.
     * 
     * @param value 검사할 문자열
     * @return 검사결과
     */
    public static boolean isEnglish( String value ) {
        return isMatched( value, "^[a-zA-Z]+$" );
    }

    /**
     * 문자열에 영문자를 가지고 있는지 여부를 확인한다.
     * 
     * @param value 검사할 문자열
     * @return 검사결과
     */
    public static boolean hasEnglish( String value ) {
        return ! isMatched( value, "^[^a-zA-Z]+$" );
    }
 
    /**
     * 문자열이 한글과 숫자로만 구성되어 있는지 여부를 확인한다.
     * 
     * @param value 검사할 문자열
     * @return 검사결과
     */
    public static boolean isNumberOrKorean( String value ) {
        return isMatched( value, "^[0-9ㄱ-ㅎㅏ-ㅣ가-힣]+$" );
    }

    /**
     * 문자열이 한글과 영문자로만 구성되어 있는지 여부를 확인한다.
     * 
     * @param value 검사할 문자열
     * @return 검사결과
     */
    public static boolean isNumberOrEnglish( String value ) {
        return isMatched( value, "^[0-9a-zA-Z]+$" );
    }
    

    /**
     * 이메일 여부를 확인한다.
     * 
     * @param value
     * @return
     */
    public static boolean isEmail( String value ) {
        return isMatched( value, "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$" );
    }
    
    
}
